// Classe No para Grafo.

#include <vcl.h>
#include <list>

#include "ClasseNoGrafo.h"

//---------------------------------------------------------------------------
NoGrafo::NoGrafo(int numero, String texto)
{
  indice  = numero;
  palavra = texto;
  ListaAresta.clear();
}

//---------------------------------------------------------------------------
void NoGrafo::setIndice(int numero)
{
  indice = numero;
}

//---------------------------------------------------------------------------
int NoGrafo::getIndice()
{
  return indice;
}

//---------------------------------------------------------------------------
void NoGrafo::setPalavra(String texto)
{
  palavra = texto;
}

//---------------------------------------------------------------------------
String NoGrafo::getPalavra()
{
  return palavra;
}

//---------------------------------------------------------------------------
bool NoGrafo::ArestaEmpty()
{
  return (ListaAresta.empty());
}

//---------------------------------------------------------------------------
void NoGrafo::addAresta(int vertice)
{
  int tamanho, i;
  bool existe;
  std::list<int>::iterator percorre;

  existe   = false;
  tamanho  = ListaAresta.size();
  percorre = ListaAresta.begin();

     // Percorre a lista de aresta verificando se a aresta ja existe.
  for(i= 1; i <= tamanho; i++)
    {
     if(*percorre == vertice)
       {
        existe = true;
        i = (tamanho + 1);
       }
     else
       {
        ++percorre;
        if(*percorre > vertice)     // Vertice nao existe na lista de arestas:
          {                         // esta e a posicao em que deve ser inserido
           i = (tamanho + 1);       // para que a lista seja ordenada.
          }
       }
    }

  if(! existe)     // Aresta nao existe. Adiciona na posicao encontrada.
    {
     ListaAresta.insert(percorre, vertice);
    }
}

//---------------------------------------------------------------------------
void NoGrafo::delAresta(int vertice)
{
  int tamanho, i;
  std::list<int>::iterator percorre;

  tamanho  = ListaAresta.size();
  percorre = ListaAresta.begin();

     // Percorre a lista de aresta para encontrar a aresta e exclui-la.
  for(i= 1; i <= tamanho; i++)
    {
     if(*percorre == vertice)
       {
        ListaAresta.erase(percorre);     // Exclui a aresta da lista.
        i = (tamanho + 1);
       }
     else
       {
        ++percorre;
       }
    }
}

//---------------------------------------------------------------------------
int NoGrafo::getAresta(int posicao)
{
  int tamanho, i, retorno;
  std::list<int>::iterator percorre;

  tamanho  = ListaAresta.size();
  percorre = ListaAresta.begin();
  retorno  = (-1);     // Caso nao encontre, retorna -1.

     // Posicao solicitada existe
  if(posicao <= tamanho)
    {
        // Percorre a lista de aresta para encontrar a posicao e retornar a aresta.
     for(i= 1; i < posicao; i++)
       {
        ++percorre;
       }

     retorno = (*percorre);
    }
  return(retorno);
}

//---------------------------------------------------------------------------
int NoGrafo::QtdeAresta()
{
  return (ListaAresta.size());
}

//---------------------------------------------------------------------------
void NoGrafo::LimpaAresta()
{
  ListaAresta.clear();
}

//---------------------------------------------------------------------------

